<?php

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of menu
 *
 * @author Adelson Murakami dos Santos
 */
class menu extends Loadview {

    public $db;
    public $route;
    protected $tabela_cms_menu = "cms_menu";
    protected $tabela_cms_menu_pagina = "cms_menu_paginas";

    public function __construct() {
        parent::__construct();
        /* INSTACIA EM TEMPO DE EXECUCAO A CLASSE DB */
        $this->db = new Dbconnection();
        /* IMPLEMENTA A CLASSE ROTAS E INSTANCIA O OBJETO EM TEMPO DE EXECUCAO */
        $this->route = loadClass::implementCoreClass('route/routes');
    }

    /* INDEX com Todo os metodos de negocios que pagina precisar */

    public function index() {
        //define qual pasta da view esta o arquivo tpl
        //mais info deste metodo http://www.smarty.net/docs/en/api.add.template.dir.tpl
        $this->addTemplateDir(str_replace("\\", "/", BASEPATH . "views/menu/"), 'menu');
        if ($this->route->getRoute() == "menu/novomenu" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->novoMenu();
        } elseif ($this->route->getRoute() == "menu/adicionarPaginas" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->adicionarPaginaMenu();
        } elseif ($this->route->getRoute() == "menu/updateurl" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->updateUrl(filter_input(INPUT_GET, 'id'), filter_input(INPUT_POST, 'id_pagina'));
        } elseif ($this->route->getRoute() == "menu/savemenu" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->salvaEstruraMenu(filter_input(INPUT_POST, 'menu_json'), filter_input(INPUT_POST, 'id_menu'));
        } elseif ($this->route->getRoute() == "menu/removeitem" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->removeItemMenu(filter_input(INPUT_POST, 'id_pk_menu_pagina'));
        } elseif ($this->route->getRoute() == "menu/deletemenu" && $_SERVER['REQUEST_METHOD'] == "POST") {
            echo $this->deleteMenu(filter_input(INPUT_POST, 'id_pk_menu'));
        } else {
            if ($this->route->getRoute() == "menu/edit") {
                $id_menu = filter_input(INPUT_GET, 'id');
                if (!empty($id_menu)) {
                    $this->assign("listaPaginasMenu", $this->nestableMenu($this->listaPaginasMenu($id_menu)));
                } else {
                    $this->assign("listaPaginasMenu", "Selecione um menu para editar");
                }
            }
            $this->assign('paginas', $this->listarPaginas());
            $this->assign("selectMenu", $this->listarNomeMenu(filter_input(INPUT_GET, 'id')));
            $this->loadView("file:[menu]menu.tpl", true);
        }
    }

    /* cadastra um novo menu */

    public function novoMenu() {
        try {
            $tabela = $this->tabela_cms_menu;
            $nome_menu = strip_tags(filter_input(INPUT_POST, 'nome_menu'));
            $status = isset($_POST['status']) ? 1 : 0;
            if (empty($nome_menu)) {
                throw new Exception("Campo nome do menu nao pode ficar em branco");
            }
            $ins = json_decode($this->db->Insert($tabela, ['nome_menu' => $nome_menu, 'status' => $status]));
            $lastId = $this->db->lastId;
            if ($ins->status) {
                if ($status) {
                    $this->modifica_status_menu($lastId);
                }
            }
            return json_encode(['status' => $ins->status, 'msg' => $ins->msg, 'lastid' => $lastId]);
        } catch (Exception $exc) {
            return json_encode(['status' => false, 'msg' => $exc->getMessage()]);
        }
    }

    /* listas as paginas que estao publicadas site */

    public function listarPaginas($id = false, $obj = FALSE) {
        try {
            $filtro = (!$id) ? NULL : "AND id = {$id}";
            $listagem = $this->db->select("cms_paginas", '*', "publicada=1 {$filtro}", $obj);
            return $listagem;
        } catch (Exception $ex) {
            error_log("Erro ao exibir paginas");
        }
    }

    /* lista os menus da tabela CMS_MENU para criar os select options */
    public function listarNomeMenu($idMenu = false) {
        $consulta = $this->db->select($this->tabela_cms_menu, "*");
        $totalConsulta = count($consulta);
        if ($totalConsulta > 0) {
            $options[0] = "Escolha aqui...";
            foreach ($consulta as $v) {
                if($v['status']){$ativo="(Ativado)";}else{$ativo='';}
                $options[$v['id']] = $v['nome_menu']." ".$ativo;
            }
        } else {
            $options = false;
        }
        ///caso o id do menu selecionado for passado mantem selecionado o options select do mesmo
        if ($idMenu) {
            $value = $idMenu;
        } else {
            $value = 0;
        }
        $this->assign("optionSelect", $value);
        return $options;
    }

    /* verifica status dos menu */

    protected function modifica_status_menu($id_menu = 0) {
        $tabela = $this->tabela_cms_menu;
        $consultaGeral = $this->db->select($tabela);
        $totalGeral = count($consultaGeral);
        if ($totalGeral > 0) {
            foreach ($consultaGeral as $k => $v) {
                if ($v['id'] != $id_menu) {
                    $this->db->update($tabela, ['status' => 0], "id={$v['id']}");
                } else {
                    $this->db->update($tabela, ['status' => 1], "id={$id_menu}");
                }
            }
        } else {
            $this->db->update($tabela, ['status' => 1], "id={$id_menu}");
        }
    }

    /* Adiciona paginas ao menu */

    protected function adicionarPaginaMenu() {
        try {
            if (empty($_POST['id_menu']) || $_POST['id_menu'] <= 0) {
                throw new Exception('Escolha Escolha um menu para poder editar as paginas');
            } else if (!isset($_POST['page_id'])) {
                throw new Exception('Escolha uma pagina para adicionar ao menu');
            }

            $id_page = $_POST['page_id'];
            $id_menu = $_POST['id_menu'];
            $total = count($id_page);
            $slug = new HandleUrl();
            for ($i = 0; $i < $total; $i++) {
                $paginas = $this->listarPaginas($id_page[$i], TRUE);
                //insere cada pagina em uma linha da Tabela cms_menu_paginas
                $dados = array('id_menu' => $id_menu,
                    'id_pagina' => $paginas[0]->id,
                    'nome_pagina' => $paginas[0]->nome,
                    'url_pagina' => $slug->slugStringUrl($paginas[0]->nome));
                $ins = $this->db->Insert($this->tabela_cms_menu_pagina, $dados);
            }
            return json_encode(array('status' => true, 'msg' => 'Paginas adicionada ao menu'));
        } catch (Exception $ex) {
            return json_encode(array('status' => false, 'msg' => $ex->getMessage()));
        }
    }

    /* atualiza a url de cada item do menu */

    public function updateUrl($id_menu, $id_pagina) {
        try {
            $slug = new HandleUrl();
            $url_pagina = strtolower(filter_input(INPUT_POST, 'url_pagina'));
            if (empty($url_pagina)) {
                throw new Exception("Campo url da pagina nao pode ficar em branco");
            }
            $upd = json_decode($this->db->update("cms_paginas", array("url_pagina" => $slug->slugStringUrl($url_pagina)), "id='{$id_pagina}' "));
            return json_encode(array("status" => $upd->status, "msg" => $upd->msg));
        } catch (Exception $exc) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

    /* cria um array bidimenssional para montar a estrutura do menu */

    protected function listaPaginasMenu($id_menu) {
        if (!empty($id_menu)) {
            $filtro = "id_menu = {$id_menu} ORDER BY pertence_id ASC";
            $consulta = $this->db->select($this->tabela_cms_menu_pagina, '*', $filtro, true);
            $itensMenu = array();
            foreach ($consulta as $k => $v) {
                $itensMenu[$v->pertence_id][$v->id] = array(
                    'pertence_id' => $v->pertence_id,
                    'id_pagina' => $v->id_pagina,
                    'id_menu' => $v->id_menu,
                    'parentUrl' => $v->url_parent,
                    'link' => $v->url_pagina,
                    'nome' => $v->nome_pagina,
                    'id' => $v->id
                );
            }
            return $itensMenu;
        } else {
            return false;
        }
    }

    /* Cria a estrutura do menu drag drop */

    public function nestableMenu(Array$items, $pertence = 0) {
        try {
            if (!is_array($items) || count($items) <= 0) {
                throw new Exception("Selecione um menu ou adicione pagina para editar o menu");
            }

            $html = "<ol class='dd-list'>";
            $i = 0;
            foreach ($items[$pertence] as $idMenu => $v) {
                $pagina = $this->listarPaginas($v['id_pagina'],true);
                
                $html.="<li class='dd-item dd3-item' data-id='{$v['id']}' data-nome='{$v['nome']}' >";
                $html.="    <div class='dd-handle dd3-handle'>Drag</div>";
                $html.="    <div class='dd3-content'>";
                $html.="        {$v['nome']}"; //name pagina
                $html.="        <a class='pull-right nestablePanel' href='javascript:;'><span class='caret'></span></a>";
                $html.="        <div class='dd-edit'>";
                $html.="            <form name='frm_edit_menu_page' method='POST' action='" . URLDOMINIOADMIN . "menu/updateurl/{$v['id_menu']}' >";
                $html.="                <label><i class='fa fa-link'></i> URL:</label>";
                $html.="                <input  type='hidden' name='id_pagina' value='{$v['id_pagina']}' /> ";
                $html.="                <input  type='hidden' name='url_parent' value='{$v['parentUrl']}' /> ";
                $html.="                <input  type='hidden' name='pertence_id' value='{$v['pertence_id']}' /> ";
                $html.="                <input  type='text' name='url_pagina' class='form-control input-sm' value='{$pagina[0]->url_pagina}' /> ";
                $html.="                <div class='save_box_menu'>";
                $html.="                    <button type='submit' class='btn btn-xs btn-success'><i class='fa fa-globe'></i> Salvar URL</button>";
                $html.="                    <button data-id_cms_menu_pagina='{$v['id']}' type='button' class='btn btn-xs btn-danger'><i class='fa fa-ban'></i> Remover</button>";
                $html.="                </div>"; //end div.save_box_menu
                $html.="            </form> "; //end form['frm_edit_menu_page']
                $html.="        </div>"; //end div.dd-edit
                $html.="    </div>"; //end div.dd3-content
                if (isset($items[$idMenu])) {
                    $html.= $this->nestableMenu($items, $idMenu);
                }
                $html.="</li>";
                $i++;
            }
            $html.= "</ol>";
            return $html;
        } catch (Exception $e) {
            return $e->getMessage();
        }
    }

    /* salva a estrura do menu em json e atualiza os niveis de cada pagina */

    protected function salvaEstruraMenu($str_json, $id_menu, $pertence_id = 0, $loop = 0) {
        try {
            if (!is_array($str_json)) {
                $json = json_decode($str_json, true);
            } else {
                $json = $str_json;
            }
            $total = count($json);
            if ($total <= 0) {
                throw new Exception("E preciso adicionar pelo uma pagina ao menu");
            }
            if ($id_menu <= 0 || empty($id_menu)) {
                throw new Exception("Selecione um menu para salvar");
            }

            foreach ($json as $k => $v) {
                $id_pk_menu = $v['id']; //PK da tabela cms_menu_pagina
                $nome_pagina = $v['nome']; //nome da pagina na tabela cms_menu_pagina
                $this->db->update($this->tabela_cms_menu_pagina, array("pertence_id" => $pertence_id), "id={$id_pk_menu} AND id_menu = {$id_menu} "); //grava
                if (isset($v['children'])) {
                    $children = $v['children']; //array filhas do json
                    foreach ($children as $obj) {
                        $child = $obj['id'];
                        $loop++;
                        //echo "{$obj['nome']}({$child}) pertence_id={$id_pk_menu}"."\n";
                        $this->db->update($this->tabela_cms_menu_pagina, array("pertence_id" => $id_pk_menu), "id={$child} AND id_menu = {$id_menu}");
                        if (isset($obj['children'])) {
                            $this->salvaEstruraMenu($obj['children'], $id_menu, $child, ++$loop);
                        }
                    }
                }
                $loop++;
            }//endforeach
            //verifica se o menu vai ser usado(ativo)
            if (isset($_POST['status_menu'])) {
                $this->modifica_status_menu($id_menu);
            }
            return json_encode(array('status' => true, 'msg' => "Menu salvo com sucesso"));
        } catch (Exception $exc) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

    /* remove item do menu */

    protected function removeItemMenu($id_item) {
        try {
            $msg;
            if ((int) $id_item <= 0) {
                throw new Exception("Ocorreu um erro inesperado ao remover este item", 110);
            }
            //Transforma todos os dependentes deste menu para o root (pertence_id = 0)
            $consulta = $this->db->select($this->tabela_cms_menu_pagina, "id", "pertence_id = {$id_item}");
            if (count($consulta) > 0) {
                foreach ($consulta as $v) {
                    $this->db->update($this->tabela_cms_menu_pagina, array('pertence_id' => 0), " id = {$v['id']} ");
                }
            }
            $del = json_decode($this->db->delete($this->tabela_cms_menu_pagina, " id = {$id_item} "));
            if ($del->status) {
                $msg = "Item removido do menu";
            } else {
                $msg = "Ocorreu um erro inesperado ao remover item do menu";
            }
            return json_encode(array('status' => $del->status, "msg" => $msg));
        } catch (Exception $exc) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }
    
    
    /*Excluir menu */
    protected function deleteMenu($id_pk_menu){
        try {
            if($id_pk_menu<=0){
                throw new Exception("Erro ao deletar o menu",110);
            }
            $del = json_decode($this->db->delete($this->tabela_cms_menu,"id={$id_pk_menu}"));
            return json_encode(array('status' => $del->status, "msg" => "Menu excluido com sucesso")); 
        } catch (Exception $exc) {
             return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }
    
}
